package k8s_ui

import (
	"context"
	"errors"
	"github.com/wonderivan/logger"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var Node node

type node struct{}

// 定义node列表的返回内容，Items是node列表，Total为node元素总数
// 先过滤，再拿total，再做分页
type NodesResp struct {
	Items []corev1.Node `json:"items"`
	Total int           `json:"total"`
}

// 获取node列表
func (p *node) GetNodes(filterName string, limit, page int) (nodesResp *NodesResp, err error) {
	//通过clintset获取node完整列表
	nodeList, err := K8s.ClientSet.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		//logger是给自己看的，return是给用户看的
		logger.Error("获取node列表失败", err)
		return nil, errors.New("获取node列表失败" + err.Error())
	}
	//return &NodesResp{
	//	Items: nodes,
	//	Total: total,
	//}, nil

	//实例化DataSelector对象,取名selectableData
	selectableData := &DataSelector{
		//获取列表当前分片数(0 node  1 node )
		GenericDataList: p.toCells(nodeList.Items),
		//过滤
		DataSelect: &DataSelectQuery{
			//过滤名称
			Filter: &FilterQuery{Name: filterName},
			//分页数量
			Paginate: &PaginateQuery{
				Limit: limit,
				Page:  page,
			},
		},
	}
	//先过滤
	filtered := selectableData.Filter()
	//再拿Total
	total := len(filtered.GenericDataList)
	//再排序和分页
	data := filtered.Sort().Paginate()
	//再将DataCell切片数据转成原生node切片
	nodes := p.fromCells(data.GenericDataList)
	//返回
	return &NodesResp{
		Items: nodes,
		Total: total,
	}, nil
}

// 把nodeCell转成corev1 node
func (p *node) fromCells(cells []DataCell) []corev1.Node {
	nodes := make([]corev1.Node, len(cells))
	for i := range cells {
		nodes[i] = corev1.Node(cells[i].(nodeCell))
	}
	return nodes
}

// 把corev1 node转成DataCell
func (p *node) toCells(std []corev1.Node) []DataCell {
	cells := make([]DataCell, len(std))
	for i := range std {
		cells[i] = nodeCell(std[i])
	}
	return cells
}

// 获取node详情
func (d *node) GetNodeDetail(nodeName string) (node *corev1.Node, err error) {
	node, err =
		K8s.ClientSet.CoreV1().Nodes().Get(context.TODO(), nodeName,
			metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取node详情失败, " + err.Error()))
		return nil, errors.New("获取node详情失败, " + err.Error())
	}
	return node, nil
}

//// 获取添加标签以及污点
//func (d *node) UpdateStatus(nodeame string, labels map[string]string) (node *corev1.Node, err error) {
//	// 获取你想要修改的节点对象
//	node, err = K8s.ClientSet.CoreV1().Nodes().Get(context.Background(), nodeame, metav1.GetOptions{})
//	if err != nil {
//		logger.Error(errors.New("UpdateStatus, " + err.Error()))
//		return nil, errors.New("UpdateStatus, " + err.Error())
//	}
//	// 修改节点的污点
//	node.ObjectMeta.Labels =
//		//labels
//		map[string]string{
//			"key1": "ssd1",
//			"key2": "ssd2",
//		}
//	print(labels)
//	node_config, _ := v1.ExtractNode(node, nodeame)
//	effect := corev1.TaintEffect("NoSchedule")
//	time_added := metav1.Now()
//	taint := v1.Taint().WithKey("test").WithValue("test").WithEffect(effect).WithTimeAdded(time_added)
//	node_config.Spec.Taints = []v1.TaintApplyConfiguration{*taint}
//
//	return node, nil
//}
